﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
//librerias especiales para la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace CityGames
{
    public class CADJuego
    {
        static private string cadConexion = System.Configuration.ConfigurationManager.ConnectionStrings["CityGames.Properties.Settings.BDCityGamesConnectionString"].ConnectionString;
        static private DSJuegosTableAdapters.JuegosTA juegosTA = new DSJuegosTableAdapters.JuegosTA();

        /************************************************** Funciones de Marcos **************************************************/

        /// <summary>
        /// Función que ejecuta la consulta pasada por parámetro en Modo Desconectado y devuelve un DataSet con el resultado en una tabla denominada con el nombre especificado
        /// </summary>
        /// <param name="select">
        /// Sentencia Select SQL que se va a ejecutar</param>
        /// <param name="nombreTabla">
        /// Nombre que tendrá la tabla con los datos en el DataSet que devuelve la función</param>
        /// <returns>
        /// Devuelve un DataSet con el resultado de la consulta ejecutado en modo desconectado</returns>
        public DataSet ObtenerDatos(string select, string nombreTabla)
        {
            DataSet resultado = new DataSet();

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                da.Fill(resultado, nombreTabla);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función para actualizar la Base de Datos con las modificaciones realizadas sobre el DataSet pasado por parámetro.
        /// </summary>
        /// <param name="datosModificados">
        /// DataSet con los cambios que se desean aplicar a la Base de Datos</param>
        /// <param name="select">
        /// Sentencia SQL Select original con la que se rellenó el DataSet</param>
        /// <returns>Devuelve True si todo ha ido bien, False en caso contrario</returns>
        public bool InsertarDatosModificados(DataSet datosModificados, string select)
        {
            bool resultado = false;

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.Update(datosModificados, datosModificados.Tables[0].TableName);

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para insertar un juego en la Base de Datos
        /// </summary>
        /// <param name="nombre">
        /// Nombre del juego</param>
        /// <param name="plataforma">
        /// Plataforma del juego</param>
        /// <param name="genero">
        /// Genero del juego</param>
        /// <param name="sinopsis">
        /// Sinopsis del juego</param>
        /// <param name="caratula">
        /// Dirección del disco duro donde se encuentra la imagen que corresponde a la carátula del juego</param>
        /// <param name="precioNuevo">
        /// Precio de venta correspondiente a una copia física nueva</param>
        /// <param name="precioSegundaMano">
        /// Precio de venta correspondiente a una copia física de segunda mano</param>
        /// <param name="tarifa">
        /// Tarifa de alquiler del juego</param>
        /// <param name="fechaLanzamiento">
        /// Fecha de lanzamiento del juego</param>
        /// <returns>
        /// Devuelve True si se ha podido realizar con éxito la inserción, False en caso contrario</returns>
        public bool InsertarJuego(string nombre, string plataforma, string genero, string sinopsis, string caratula, string precioNuevo, string precioSegundaMano, string tarifa, DateTime fechaLanzamiento)
        {
            bool resultado = false;

            try
            {
                if (ExisteJuego(nombre, plataforma))
                {
                    resultado = false;
                }
                else
                {
                    if (precioNuevo == "" && precioSegundaMano == "")
                    {
                        juegosTA.InsertarJuego(nombre, plataforma, genero, sinopsis, caratula, null, null, tarifa, fechaLanzamiento.ToShortDateString());
                    }
                    else if (precioNuevo == "")
                    {
                        juegosTA.InsertarJuego(nombre, plataforma, genero, sinopsis, caratula, null, decimal.Parse(precioSegundaMano), tarifa, fechaLanzamiento.ToShortDateString());
                    }
                    else if (precioSegundaMano == "")
                    {
                        juegosTA.InsertarJuego(nombre, plataforma, genero, sinopsis, caratula, decimal.Parse(precioNuevo), null, tarifa, fechaLanzamiento.ToShortDateString());
                    }
                    else
                    {
                        juegosTA.InsertarJuego(nombre, plataforma, genero, sinopsis, caratula, decimal.Parse(precioNuevo), decimal.Parse(precioSegundaMano), tarifa, fechaLanzamiento.ToShortDateString());
                    }


                    resultado = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para actualizar en la Base de Datos los cambios que se han realizado sobre un DataSet que contiene juegos filtrados de la Base de Datos
        /// </summary>
        /// <param name="juegos">
        /// DataSet con la coleccion de juegos filtrados cuyos cambios se desean reflejar en la Base de Datos</param>
        /// <param name="nombre">
        /// Nombre del juego por el que se desea filtrar, "" corresponde a no filtrar por nombre</param>
        /// <param name="genero">
        /// Genero del juego por el que se desea filtrar, "Todos" corresponde a no filtrar por Genero</param>
        /// <param name="plataforma">
        /// Plataforma del juego por la que se desea filtrar, "Todas" corresponde a no filtrar por Plataforma</param>
        /// <param name="fechaInicio">
        /// Fecha de Lanzamiento desde la que se desea filtrar</param>
        /// <param name="fechaFin">
        /// Fecha de Lanzamiento hasta la que se desea filtrar</param>
        /// <param name="desde">
        /// Número de fila de la Base de Datos desde la que se desea filtrar</param>
        /// <param name="hasta">
        /// Número de fila de la Base de Datos hasta la que se desea filtrar</param>
        /// <returns></returns>
        public bool ActualizarJuegos(DataSet juegos, string nombre, string genero, string plataforma, DateTime fechaInicio, DateTime fechaFin, int desde, int hasta)
        {
            bool resultado = false;
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'P.Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'F.Lanzamiento' ";
                select += "FROM (SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW ";
                select += "FROM Juego ";
                select += "WHERE (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "') ";
                select += "AND (FechaLanzamiento BETWEEN '" + fechaInicio.ToShortDateString() + "' AND '" + fechaFin.ToShortDateString() + "')) AS JuegosFiltrados ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = InsertarDatosModificados(juegos, select);

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener todos los datos del juego que se especifica por parámetro
        /// </summary>
        /// <param name="nombreJuego">
        /// Nombre del juego del cual se desean obtener sus datos</param>
        /// /// <param name="plataformaJuego">
        /// Nombre de la plataforma del juego del cual se desean obtener sus datos</param>
        /// <returns>
        /// Devuelve un DataTable con los datos del juego</returns>
        public DataTable ObtenerDatosDeJuego(string nombreJuego, string plataformaJuego)
        {
            DataTable resultado = new DataTable();

            try
            {
                string select = "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, Puntuacion ";
                select += "FROM Juego WHERE (Nombre='" + nombreJuego + "') AND (Plataforma = '" + plataformaJuego + "')";

                resultado = ObtenerDatos(select, "DatosDeJuego").Tables["DatosDeJuego"];
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve los juegos filtrados por Nombre, Genero, Plataforma y Fecha de Lanzamiento desde la fila "desde" hasta la fila "hasta" de la Base de Datos
        /// </summary>
        /// <param name="nombre">
        /// Nombre del juego por el que se desea filtrar, "" corresponde a no filtrar por nombre</param>
        /// <param name="genero">
        /// Genero del juego por el que se desea filtrar, "Todos" corresponde a no filtrar por Genero</param>
        /// <param name="plataforma">
        /// Plataforma del juego por la que se desea filtrar, "Todas" corresponde a no filtrar por Plataforma</param>
        /// <param name="fechaInicio">
        /// Fecha de Lanzamiento desde la que se desea filtrar</param>
        /// <param name="fechaFin">
        /// Fecha de Lanzamiento hasta la que se desea filtrar</param>
        /// <param name="desde">
        /// Número de fila de la Base de Datos desde la que se desea filtrar</param>
        /// <param name="hasta">
        /// Número de fila de la Base de Datos hasta la que se desea filtrar</param>
        /// <returns>
        /// Devuelve un DataSet con los juegos de la Base de Datos filtrados y paginados</returns>
        public DataSet ObtenerJuegosFiltrados(string nombre, string genero, string plataforma, DateTime fechaInicio, DateTime fechaFin, int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT     Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'P.Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'F.Lanzamiento' ";
                select += "FROM         (SELECT     Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW ";
                select += "FROM         Juego ";
                select += "WHERE     (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if(plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "') ";
                select += "AND (FechaLanzamiento BETWEEN '" + fechaInicio.ToShortDateString() + "' AND '" + fechaFin.ToShortDateString() + "')) AS JuegosFiltrados ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = ObtenerDatos(select, "JuegosFiltrados");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Función que devuelve el número total de juegos que hay en la Base de Datos atendiendo a los filtros especificados
        /// </summary>
        /// <param name="nombre">
        /// Nombre del juego por el que se desea filtrar, "" corresponde a no filtrar por nombre</param>
        /// <param name="genero">
        /// Genero del juego por el que se desea filtrar, "Todos" corresponde a no filtrar por Genero</param>
        /// <param name="plataforma">
        /// Plataforma del juego por la que se desea filtrar, "Todas" corresponde a no filtrar por Plataforma</param>
        /// <param name="fechaInicio">
        /// Fecha de Lanzamiento desde la que se desea filtrar</param>
        /// <param name="fechaFin">
        /// Fecha de Lanzamiento hasta la que se desea filtrar</param>
        /// <returns></returns>
        public int ObtenerNumeroDeJuegosFiltrados(string nombre, string genero, string plataforma, DateTime fechaInicio, DateTime fechaFin)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) ";
                select += "FROM   Juego ";
                select += "WHERE  (Nombre LIKE @nombre) ";
                if (genero != "Todos")
                    select += "AND (Genero = @genero) ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = @plataforma) ";
                select += "AND (FechaLanzamiento BETWEEN @fechaInicio AND @fechaFin)";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombre"].Value = "%" + nombre + "%";
                comandoSql.Parameters.Add("@genero", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@genero"].Value = genero;
                comandoSql.Parameters.Add("@plataforma", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataforma"].Value = plataforma;
                comandoSql.Parameters.Add("@fechaInicio", SqlDbType.Date);
                comandoSql.Parameters["@fechaInicio"].Value = fechaInicio;
                comandoSql.Parameters.Add("@fechaFin", SqlDbType.Date);
                comandoSql.Parameters["@fechaFin"].Value = fechaFin;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que comprueba si existe el juego pasado como parámetro en la Base de Datos
        /// </summary>
        /// <param name="nombre">
        /// Nombre del juego que se desea buscar</param>
        /// <param name="plataforma">
        /// Plataforma del juego que se desea buscar</param>
        /// <returns>
        /// Devuelve True si existe el juego en la Base de Datos, False en caso contrario</returns>
        public bool ExisteJuego(string nombre, string plataforma)
        {
            bool resultado = false;
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT Nombre FROM Juego WHERE (Nombre = @nombre) AND (Plataforma = @plataforma)";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@nombre", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombre"].Value = nombre;
                comandoSql.Parameters.Add("@plataforma", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataforma"].Value = plataforma;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para obtener la fecha de lanzamiento del juego con fecha de lanzamiento más alta de la Base de Datos
        /// </summary>
        /// <returns>
        /// Devuelve un DateTime con la fecha de lanzamiento del juego con fecha de lanzamiento más alta de la Base de Datos</returns>
        public DateTime ObtenerFechaMaxima()
        {
            DateTime resultado = new DateTime();
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT TOP (1) FechaLanzamiento FROM Juego WHERE FechaLanzamiento IS NOT NULL ORDER BY FechaLanzamiento DESC";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = DateTime.Parse(dr[0].ToString());
                else
                    resultado = DateTime.Today;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para obtener la fecha de lanzamiento del juego con fecha de lanzamiento más baja de la Base de Datos
        /// </summary>
        /// <returns>
        /// Devuelve un DateTime con la fecha de lanzamiento del juego con fecha de lanzamiento más baja de la Base de Datos</returns>
        public DateTime ObtenerFechaMinima()
        {
            DateTime resultado = new DateTime();
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT TOP (1) FechaLanzamiento FROM Juego WHERE FechaLanzamiento IS NOT NULL ORDER BY FechaLanzamiento ASC";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = DateTime.Parse(dr[0].ToString());
                else
                    resultado = DateTime.Today;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener una coleccion de objetos para poder autocompletar los juegos en un TextBox
        /// </summary>
        /// <returns>
        /// Devuelve una coleccion de Strings para autocompletar un TextBox con todos los juegos</returns>
        public AutoCompleteStringCollection ObtenerTodosLosJuegosParaAutocompletado()
        {
            AutoCompleteStringCollection resultado = new AutoCompleteStringCollection();
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT Nombre, Plataforma FROM Juego";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                while (dr.Read())
                    resultado.Add(dr["Nombre"].ToString() + " - " + dr["Plataforma"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para obtener el número de juegos de una promocion atendiendo a los filtros especificados por parámetro
        /// </summary>
        /// <param name="codigoPromocion">
        /// Codigo de la promocion</param>
        /// <param name="nombreJuego">
        /// Cadena de texto que debe contener el nombre de los juegos que se desean mostrar</param>
        /// <param name="plataformaJuego">
        /// Plataforma de los juegos que se desean mostrar</param>
        /// <param name="generoJuego">
        /// Genero de los juegos que se desean mostrar</param>
        /// <returns></returns>
        public int ObtenerNumeroDeJuegosDePromocionFiltrados(int codigoPromocion, string nombreJuego, string plataformaJuego, string generoJuego)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT (*) FROM Juego J, JuegosPromociones JP ";
                select += "WHERE (JP.Codigo = @codigoPromocion) AND (J.Nombre = JP.Nombre) AND (J.Plataforma = JP.Plataforma) AND (J.Nombre LIKE @nombreJuego) ";
                if (plataformaJuego != "Todas")
                    select += "AND (J.Plataforma = @plataformaJuego) ";
                if (generoJuego != "Todos")
                    select += "AND (Genero = @generoJuego)";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.Parameters.Add("@codigoPromocion", SqlDbType.Int);
                comandoSql.Parameters["@codigoPromocion"].Value = codigoPromocion;
                comandoSql.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                comandoSql.Parameters["@nombreJuego"].Value = "%" + nombreJuego + "%";
                comandoSql.Parameters.Add("@generoJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@generoJuego"].Value = generoJuego;
                comandoSql.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                comandoSql.Parameters["@plataformaJuego"].Value = plataformaJuego;
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Función para obtener los juegos de una promocion filtrados por los parámetros especificados y paginados para mostrarlos en un DataGridView
        /// </summary>
        /// <param name="codigoPromocion">
        /// Codigo de la promocion de los juegos que se desean mostrar</param>
        /// <param name="nombreJuego">
        /// Cadena de texto que debe contener el título de los juegos que se van a mostrar</param>
        /// <param name="plataformaJuego">
        /// Plataforma de los juegos que se desean mostrar</param>
        /// <param name="generoJuego">
        /// Genero de los juegos que se desean mostrar</param>
        /// <param name="desde">
        /// Entero que indica desde que número de fila se desea mostrar</param>
        /// <param name="hasta">
        /// Entero que indica hasta que número de fila se desea mostrar</param>
        /// <returns></returns>
        public DataSet ObtenerJuegosDePromocionPaginados(int codigoPromocion, string nombreJuego, string plataformaJuego, string generoJuego, int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'Precio Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'Fecha de Lanzamiento' ";
                select += "FROM (SELECT J.Nombre, J.Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY J.Nombre ASC) AS ROW FROM Juego J, JuegosPromociones JP ";
                select += "WHERE (JP.Codigo = " + codigoPromocion + ") AND (J.Nombre = JP.Nombre) AND (J.Plataforma = JP.Plataforma) AND (J.Nombre LIKE '%" + nombreJuego + "%') ";
                if (plataformaJuego != "Todas")
                    select += "AND (J.Plataforma = '" + plataformaJuego + "') ";
                if (generoJuego != "Todos")
                    select += "AND (Genero = '" + generoJuego + "')";
                select += ") AS JuegosDePromocion ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = ObtenerDatos(select, "JuegosDePromocion");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public DataSet ObtenerImagenesDeJuego(string nombreJuego, string plataformaJuego)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT ImagenJuego FROM ImagenJuego WHERE (NombreJuego = '" + nombreJuego + "') AND (PlataformaJuego = '" + plataformaJuego + "')";

                resultado = ObtenerDatos(select, "JuegosDePromocion");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public bool InsertarImagenDeJuego(string nombreJuego, string plataformaJuego, string nombreFichero)
        {
            bool resultado = false;
            string insert = "";
            string update = "";

            SqlConnection conexion = null;
            SqlCommand command = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                if (!ExisteImagenDeJuego(nombreJuego, plataformaJuego, nombreFichero))
                {
                    insert = "INSERT INTO ImagenJuego (ImagenJuego, NombreJuego, PlataformaJuego) ";
                    insert += "VALUES (@nombreFichero, @nombreJuego, @plataformaJuego)";
                    command = new SqlCommand(insert, conexion);
                }
                else
                {
                    update = "UPDATE ImagenJuego SET NombreJuego = @nombreJuego, PlataformaJuego = @plataformaJuego ";
                    update += "WHERE (ImagenJuego = @nombreFichero)";
                    command = new SqlCommand(update, conexion);
                }

                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;
                command.Parameters.Add("@nombreFichero", SqlDbType.VarChar, 100);
                command.Parameters["@nombreFichero"].Value = nombreFichero;

                command.ExecuteNonQuery();

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        private bool ExisteImagenDeJuego(string nombreJuego, string plataformaJuego, string nombreFichero)
        {
            bool resultado = false;
            string select = "";

            SqlConnection conexion = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select = "SELECT * FROM ImagenJuego ";
                select += "WHERE (ImagenJuego = @nombreFichero)";

                command = new SqlCommand(select, conexion);
                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;
                command.Parameters.Add("@nombreFichero", SqlDbType.VarChar, 100);
                command.Parameters["@nombreFichero"].Value = nombreFichero;

                dr = command.ExecuteReader();

                if (dr.Read())
                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool BorrarImagenDeJuego(string nombreFichero)
        {
            bool resultado = false;

            string delete = "";
            SqlConnection conexion = null;
            SqlCommand comando = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                delete = "DELETE FROM ImagenJuego WHERE (ImagenJuego = @nombreFichero)";
                comando = new SqlCommand(delete, conexion);
                comando.Parameters.Add("@nombreFichero", SqlDbType.VarChar, 100);
                comando.Parameters["@nombreFichero"].Value = nombreFichero;

                comando.ExecuteNonQuery();

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public DataSet ObtenerTodosLosJuegosFiltrados(string nombre, string genero, string plataforma)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select = "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, Puntuacion ";
                select += "FROM Juego ";
                select += "WHERE (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "') ";

                resultado = ObtenerDatos(select, "JuegosFiltrados");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/

        /*************************************************** Funciones de Mirellys ***************************************************/
        /// <summary>
        /// Función que obtiene los nombres de los juegos existentes en el sistema haciendo uso del metodo conectado
        /// </summary>
        /// <returns>
        /// Devuelve un Datatable con los nombres de los juegos.
        /// </returns>
        public DataTable ObtenerNombreJuegos()
        {
            SqlConnection conexion = null;
            DataTable dt = null;
            try
            {
                string select = "SELECT DISTINCT Nombre FROM Juego";              
                conexion = new SqlConnection(cadConexion);
                conexion.Open();
                SqlCommand com = new SqlCommand(select, conexion);
                SqlDataReader dr = com.ExecuteReader();

                dt = new DataTable();
                dt.Columns.Add("Nombre");

                DataRow row = dt.NewRow();

                while (dr.Read())
                {
                    row["Nombre"] = dr["Nombre"].ToString();
                    dt.Rows.Add(row);
                    row = dt.NewRow();
                }
                dr.Close();
            }
            catch (Exception ex) 
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
            
            return dt;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="genero"></param>
        /// <param name="plataforma"></param>
        /// <param name="fechaInicio"></param>
        /// <param name="fechaFin"></param>
        /// <returns></returns>
        public int ObtenerNumeroDeJuegosParaPromocion(string nombre, string genero, string plataforma)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) ";
                select += "FROM   Juego ";
                select += "WHERE  (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "')";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="genero"></param>
        /// <param name="plataforma"></param>
        /// <param name="fechaInicio"></param>
        /// <param name="fechaFin"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public DataSet ObtenerJuegosFiltradosParaPromocion(string nombre, string genero, string plataforma, int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'P.Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'F.Lanzamiento' ";
                select += "FROM (SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW ";
                select += "FROM Juego ";
                select += "WHERE (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "') ";
                select += ") AS JuegosFiltrados ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = ObtenerDatos(select, "JuegosFiltrados");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="genero"></param>
        /// <param name="plataforma"></param>
        /// <returns></returns>
        public DataSet ObtenerTodosJuegosFiltradosParaPromocion(string nombre, string genero, string plataforma)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'P.Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'F.Lanzamiento' ";
                select += "FROM Juego ";
                select += "WHERE (Nombre LIKE '%" + nombre + "%') ";
                if (genero != "Todos")
                    select += "AND (Genero = '" + genero + "') ";
                if (plataforma != "Todas")
                    select += "AND (Plataforma = '" + plataforma + "') ";

                resultado = ObtenerDatos(select, "TodosJuegosFiltrados");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="plataforma"></param>
        /// <returns></returns>
        public bool ExisteJuegoSeleccionadoEnTablaVirtual(string nombre, string plataforma)
        {
            bool resultado = false;
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT Nombre FROM JuegoVirtual WHERE (Nombre = '" + nombre + "') AND (Plataforma = '" + plataforma + "')";
                
                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// InsertarJuegoVirtualPromociones Inserta los juegos que van a tener promociones
        /// </summary>
        /// <param name="nombre">Nombre del juego al que le aplicaré la promoción</param>
        /// <param name="plataforma">Plataforma del juego al que le aplicaré la promoción</param>
        /// <returns></returns>
        public bool InsertarJuegoVirtualPromociones(string nombre, string plataforma, string genero, string sinopsis, string caratula, string precioNuevo, string precioSegundaMano, string tarifa, DateTime fechaLanzamiento)
        {
            bool resultado = false;
            string insert = "";

            SqlConnection conexion = null;
            SqlCommand comandoSql = null;
            SqlParameter paramPrecioNuevo = null;
            SqlParameter paramPrecioSegunda = null;
            SqlParameter paramNombre = null;
            SqlParameter paramSinopsis = null;
            SqlParameter paramCaratula = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                if (!ExisteJuegoSeleccionadoEnTablaVirtual(nombre, plataforma))
                {
                    paramNombre = new SqlParameter("@nombreJ", System.Data.SqlDbType.VarChar, 50);
                    paramNombre.Value = nombre;

                    paramSinopsis = new SqlParameter("@sinopsisJ", System.Data.SqlDbType.VarChar, 8000);
                    paramSinopsis.Value = sinopsis;

                    paramCaratula = new SqlParameter("@caratulaJ", System.Data.SqlDbType.VarChar, 500);
                    paramCaratula.Value = caratula;

                    if (precioNuevo == "" && precioSegundaMano == "")
                    {
                        insert = "INSERT INTO JUEGOVIRTUAL (Nombre, Plataforma, Genero, Sinopsis, Caratula, Tarifa, FechaLanzamiento) ";
                        insert += "VALUES (@nombreJ, '" + plataforma + "', '" + genero + "', @sinopsisJ, @caratulaJ, '" + tarifa + "' , '" + fechaLanzamiento.ToShortDateString() + "')";

                        comandoSql = new SqlCommand(insert, conexion);

                    }
                    else if (precioNuevo == "")
                    {
                        paramPrecioSegunda = new SqlParameter("@precioS", System.Data.SqlDbType.Decimal);
                        paramPrecioSegunda.Value = precioSegundaMano;

                        insert = "INSERT INTO JUEGOVIRTUAL (Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioSegundaMano, Tarifa, FechaLanzamiento) ";
                        insert += "VALUES (@nombreJ, '" + plataforma + "', '" + genero + "', @sinopsisJ, @caratulaJ, @precioS , '" + tarifa + "' , '" + fechaLanzamiento.ToShortDateString() + "')";

                        comandoSql = new SqlCommand(insert, conexion);
                        comandoSql.Parameters.Add(paramPrecioSegunda);
                    }
                    else if (precioSegundaMano == "")
                    {
                        paramPrecioNuevo = new SqlParameter("@precioN", System.Data.SqlDbType.Decimal);
                        paramPrecioNuevo.Value = precioNuevo;

                        insert = "INSERT INTO JUEGOVIRTUAL (Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioSegundaMano, Tarifa, FechaLanzamiento) ";
                        insert += "VALUES (@nombreJ, '" + plataforma + "', '" + genero + "', @sinopsisJ, @caratulaJ, @precioN, '" + tarifa + "',  '" + fechaLanzamiento.ToShortDateString() + "')";

                        comandoSql = new SqlCommand(insert, conexion);
                        comandoSql.Parameters.Add(paramPrecioNuevo);
                    }
                    else
                    {
                        paramPrecioSegunda = new SqlParameter("@precioS", System.Data.SqlDbType.Decimal);
                        paramPrecioSegunda.Value = precioSegundaMano;

                        paramPrecioNuevo = new SqlParameter("@precioN", System.Data.SqlDbType.Decimal);
                        paramPrecioNuevo.Value = precioNuevo;

                        insert = "INSERT INTO JuegoVirtual (Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento) ";
                        insert += "VALUES (@nombreJ, '" + plataforma + "', '" + genero + "', @sinopsisJ, @caratulaJ, @precioN, @precioS, '" + tarifa + "',  '" + fechaLanzamiento.ToShortDateString() + "')";

                        comandoSql = new SqlCommand(insert, conexion);
                        comandoSql.Parameters.Add(paramPrecioNuevo);
                        comandoSql.Parameters.Add(paramPrecioSegunda);
                    }

                    comandoSql.Parameters.Add(paramNombre);
                    comandoSql.Parameters.Add(paramSinopsis);
                    comandoSql.Parameters.Add(paramCaratula);

                    comandoSql.ExecuteNonQuery();
                    resultado = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }
            return resultado;
        }

        /// <summary>
        /// Funcion que me busca la cantidad de juegos seleccionador para aplicarles una promocion
        /// </summary>
        /// <returns>Devuelve un numero entero con la cantidad de juegos seleccionados para aplicarles una promocion</returns>
        public int ObtenerNumeroDeJuegosVirtuales()
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM JuegoVirtual";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public DataSet ObtenerJuegosVirtuales(int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'P.Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'F.Lanzamiento' ";
                select += "FROM (SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW FROM JuegoVirtual) AS JuegosSeleccionados ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = ObtenerDatos(select, "JuegosSeleccionados");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public bool BorrarJuegosVirtuales()
        {
            bool resultado = false;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "DELETE FROM JuegoVirtual";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.ExecuteReader();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="plataforma"></param>
        /// <returns></returns>
        public bool BorrarUnJuegoVirtual(string nombre, string plataforma)
        {
            bool resultado = false;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "DELETE FROM JuegoVirtual where nombre = '"+nombre+"' AND plataforma = '"+plataforma+"'";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                comandoSql.ExecuteReader();
                resultado = true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public int ObtenerNumeroDeJuegosEditarPromocion(int codigoPromocion)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) FROM JuegosPromociones WHERE Codigo="+codigoPromocion+"";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public DataSet ObtenerJuegosEditarPromocion(int codigoPromocion, int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";

            try
            {
                select += "SELECT Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo as 'Precio Nuevo', PrecioSegundaMano as 'P.2ª Mano', Tarifa, FechaLanzamiento as 'Fecha de Lanzamiento' ";
                select += "FROM (SELECT J.Nombre, J.Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento, ROW_NUMBER() OVER (ORDER BY J.Nombre ASC) AS ROW FROM Juego J, JuegosPromociones JP WHERE (JP.Codigo = "+codigoPromocion+") AND (J.Nombre = JP.Nombre) AND (J.Plataforma = JP.Plataforma)) AS JuegosEnPromocion ";
                select += "WHERE (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = ObtenerDatos(select, "JuegosEnPromocion");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="codigoPromocion"></param>
        /// <returns></returns>
        public bool InsertarJuegosVirtualesDePromocionExistente(int codigoPromocion)
        {
            bool resultado = false;
            string insert = "";
            SqlConnection conexion = null;
            SqlCommand comandoSql = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                    insert += "INSERT INTO JuegoVirtual (Nombre, Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento) ";
                    insert += " (SELECT J.Nombre, J.Plataforma, Genero, Sinopsis, Caratula, PrecioNuevo, PrecioSegundaMano, Tarifa, FechaLanzamiento FROM Juego J, JuegosPromociones JP WHERE (JP.Codigo = " + codigoPromocion + ") AND (J.Nombre = JP.Nombre) AND (J.Plataforma = JP.Plataforma)) ";

                    comandoSql = new SqlCommand(insert, conexion);
                    comandoSql.ExecuteNonQuery();

                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }
        /// <summary>
        ///  ObtenerXTopGames+
        ///  Función que devuelve los diez juegos con mejor puntuación para rellenar una lista en el Inicio
        /// </summary>
        /// <returns></returns>
        public DataSet ObtenerXTopGames()
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT TOP(10) Nombre, Plataforma, Puntuacion ";
                select += "FROM Juego ORDER BY Puntuacion DESC";

                resultado = ObtenerDatos(select, "TopDiezGames");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerXUltimosLanzamientos()
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT TOP(10) Nombre, Plataforma, FechaLanzamiento ";
                select += "FROM Juego ";
                select += "WHERE FechaLanzamiento <= GETDATE() ";
                select += "ORDER BY FechaLanzamiento DESC";

                resultado = ObtenerDatos(select, "UltimosDiezLanzamientos");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerXProximosLanzamientos()
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT TOP(10) Nombre, Plataforma, FechaLanzamiento ";
                select += "FROM Juego ";
                select += "WHERE FechaLanzamiento > GETDATE() ";
                select += "ORDER BY FechaLanzamiento ASC";

                resultado = ObtenerDatos(select, "ProximosDiezLanzamientos");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }
        /************************************************** Funciones de Ruben **************************************************/

        /// <summary>
        /// Funcion que devuelve la ruta de la caratula de un juego
        /// </summary>        
        /// <param name="nombre">
        /// El nombre del juego</param>
        /// <param name="plataforma">
        /// La plataforma del juego</param>
        /// <returns>
        /// La ruta a la foto de la caratula.
        /// </returns>
        public string GetCaratula(string nombre, string plataforma)
        {
            string resultado = "";
            SqlConnection c = null;
            string select = "select caratula from juego where nombre = '" + nombre + "' and plataforma = '" + plataforma + "';";

            try
            {
                c = new SqlConnection(cadConexion);
                c.Open();
                SqlCommand command = new SqlCommand(select, c);
                SqlDataReader dr = command.ExecuteReader();
                if (dr.Read())
                    resultado = dr["caratula"].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }

            return resultado;
        }

        /// <summary>
        /// Funcion que devuelve el precio de un juego
        /// </summary>        
        /// <param name="nombre">
        /// El nombre del juego</param>
        /// <param name="plataforma">
        /// La plataforma del juego</param>
        /// <param name="tipo">
        /// El tipo del juego (nuevo o segunda mano)</param>
        /// <returns>
        /// El precio del juego
        /// </returns>
        public string GetPrecio(string nombre, string plataforma, string tipo)
        {
            string resultado = "";
            SqlConnection c = null;
            string select = "";

            if(tipo == "nuevo")
                select += "select PrecioNuevo as Precio from juego where nombre = '" + nombre + "' and plataforma = '" + plataforma + "';";
            else if( tipo == "segunda")
                select += "select PrecioSegundaMano as Precio from juego where nombre = '" + nombre + "' and plataforma = '" + plataforma + "';";

            try
            {
                c = new SqlConnection(cadConexion);
                c.Open();
                SqlCommand command = new SqlCommand(select, c);
                SqlDataReader dr = command.ExecuteReader();
                if (dr.Read())
                    resultado = dr["Precio"].ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Ruben **************************************************/
        /**************************************************Funciones de Enrique ************************************************/
        public DataSet ObtenerTopGames(string plataforma)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma, ROW_NUMBER() OVER (ORDER BY Puntuacion DESC) AS Posicion ";
                select += "FROM Juego ";
                select += "WHERE Plataforma = '" + plataforma + "' ";
                //select += "ORDER BY Puntuacion DESC";

                resultado = ObtenerDatos(select, "TopGames");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado; 
        }

        public DataSet ObtenerTopGamesGenero(string plataforma, string genero)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma, ROW_NUMBER() OVER (ORDER BY Puntuacion DESC) AS Posicion ";
                select += "FROM Juego ";
                select += "WHERE Plataforma = '" + plataforma + "' ";
                select += "AND Genero = '" + genero + "' ";

                resultado = ObtenerDatos(select, "TopGamesGenero");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerAllGames(string plataforma)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma ";
                select += "FROM Juego ";
                select += "WHERE Plataforma = '" + plataforma + "' ";
                select += "ORDER BY Nombre ASC";

                resultado = ObtenerDatos(select, "AllGames");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerAllGamesPorLetra(string plataforma, string letra)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma ";
                select += "FROM Juego ";
                select += "WHERE (Plataforma = '" + plataforma + "') ";
                select += "AND (Nombre like '" + letra + "%') "; 
                select += "ORDER BY Nombre ASC";

                resultado = ObtenerDatos(select, "AllGamesPorLetra");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerUltimosLanzamientos(string plataforma)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma ";
                select += "FROM Juego ";
                select += "WHERE Plataforma = '" + plataforma + "' ";
                select += "AND FechaLanzamiento <= GETDATE() ";
                select += "ORDER BY FechaLanzamiento DESC";

                resultado = ObtenerDatos(select, "UltimosLanzamientos");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public DataSet ObtenerProximosLanzamientos(string plataforma)
        {
            DataSet resultado = new DataSet();

            try
            {
                string select = "SELECT Nombre, Genero, FechaLanzamiento, Puntuacion, Caratula, Plataforma ";
                select += "FROM Juego ";
                select += "WHERE Plataforma = '" + plataforma + "' ";
                select += "AND FechaLanzamiento > GETDATE() ";
                select += "ORDER BY FechaLanzamiento ASC";

                resultado = ObtenerDatos(select, "ProximosLanzamientos");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        /**************************************************Fin Funciones de Enrique ************************************************/
    }
 }
